/**
 * 
 */
package t4j.typeinfo;

import java.lang.reflect.Method;

import t4j.typeinfo.interfacea.A;
import t4j.typeinfo.packageaccess.HiddenC;


public class HiddenImplementation {

	public static void main(String[] args) throws Exception {
		
		A a= HiddenC.makeA();
		
		a.f();
		
		System.out.println(a.getClass().getName());
		
		/* 这里因为C是包内访问，所以在这里访问不了，从而防止向下转型
		if(a instanceof C){
			C c = (C)a;
			
			c.g();
		}*/
		
		//使用反射就可以调用了
		callHiddenMethod(a, "g");
		callHiddenMethod(a, "u");
		callHiddenMethod(a, "v");
		callHiddenMethod(a, "w");
	}
	
	static void callHiddenMethod(Object a,String methodName) throws Exception{
		
		// 返回一个 Method 对象，该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
		Method  g = a.getClass().getDeclaredMethod(methodName);
		
		//值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。
		g.setAccessible(true);
		
		//对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
		g.invoke(a);
	}
}
